package com.baturu.mybatisminus.dao;

import com.baturu.mybatisminus.annotation.Column;
import com.baturu.mybatisminus.annotation.NoRepositoryBean;
import com.baturu.mybatisminus.base.Pageable;
import com.baturu.mybatisminus.base.Sort;

import java.util.Collection;
import java.util.List;

/**
 * DAO基础接口，通过继承该接口实现常规CRUD功能
 * @author huangbin
 * @param <T> 实体类型
 * @param <ID> id类型
 */
@NoRepositoryBean
public interface BaseDAO<T, ID> {

    /**
     * 保存一条新纪录，会对所有字段进行插入，自动回填id
     */
    int save(T entity);

    /**
     * 保存一条新纪录，只插入不为null的字段，自动回填id<br>
     * 对于String类型字段如果需要忽略空字符串则将Column注解的emptyStringAsNull设为true
     * @see Column#emptyStringAsNull()
     */
    int dynamicSave(T entity);

    /**
     * 批量保存一批新纪录，会对所有字段进行插入，自动回填id
     */
    int batchSave(Collection<T> entities);

    /**
     * 根据id删除一条记录
     */
    int deleteById(ID id);

    /**
     * 根据id删除一批记录
     */
    int deleteByIds(Collection<ID> ids);



    /**
     *根据id更新一条记录，会对所有字段进行更新
     */
    int update(T entity);

    /**
     * 根据id更新一条记录，只更新不为空的字段<br>
     * 对于String类型字段如果需要忽略空字符串则将Column注解的emptyStringAsNull设为true
     * @see Column#emptyStringAsNull()
     */
    int dynamicUpdate(T entity);



    /**
     * 根据id找出一条记录
     */
    T findById(ID id);

    /**
     * 根据id找出一批记录
     */
    List<T> findByIds(Collection<ID> ids);

    /**
     * 查找所有
     */
    List<T> findAll();

    /**
     * 分页查找
     */
    List<T> findPage(Pageable page, Sort sort);


    /**
     * 统计总记录数
     */
    int count();





}